package cn.wangkai.peanut.db;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;

import cn.wangkai.peanut.db.iface.IDb;
import cn.wangkai.peanut.db.iface.IMyDb;

public class MyDb implements IMyDb {
	private IDb db = null;
	private Connection conn=null;
	private Boolean Transaction = false;
	/**
	 * @deprecated {@link #Open()} instead
	 */
	public MyDb(){
		
	}
	public static IMyDb Open(IDb db) {
		IMyDb mydb = null;
		while (mydb == null) {
			synchronized (MyDb.class) {
				if (mydb == null) {
					mydb = new MyDb();
					try {
						mydb.setDb(db);
					} catch (WKDbException e) {
						e.printStackTrace();
					}
					DbStore.add(mydb);
				}
			}
		}
		return mydb;
	}
	
//	public MyDb(IDb db){
//		try {
//			this.setDb(db);
//		} catch (WKDbException e) {
//			e.printStackTrace();
//		}
//		DbStore.add(this);
//	}
//	/**
//	 * @deprecated {@link #Open()} instead
//	 */
//	public static IMyDb Open(IDb db) {
//		IMyDb mydb = null;
//		while (mydb == null) {
//			synchronized (MyDb.class) {
//				if (mydb == null) {
//					mydb = new MyDb();
//					try {
//						mydb.setDb(db);
//					} catch (WKDbException e) {
//						e.printStackTrace();
//					}
//					DbStore.add(mydb);
//				}
//			}
//		}
//		IMyDb mydb = null;
//		try {
//			mydb = new MyDb();
//			mydb.setDb(db);
//			DbStore.add(mydb);
//		} catch (WKDbException e) {
//			e.printStackTrace();
//		}
//		return mydb;
//		return null;
//	}
	
	/**
	 * 关闭连接
	 * @param conn 数据库连
	 */
	public void Close() {
		if(conn==null) return;
		DbUtils.closeQuietly(this.conn);
		try {
			if(conn.isClosed()) conn = null;
		} catch (SQLException e) {
		}
		DbStore.remove(this);
	}

	public void BeginTransaction() {
		Transaction = true;
	}


	public Boolean getTransaction() {
		return Transaction;
	}

	public void Commit() {
		if(conn!=null&&Transaction){
			try {
				conn.commit();
			} catch (SQLException e) {
			}
		}
		
	}

	public void Rollback() {
		if(conn!=null&&Transaction){
			try {
				conn.rollback();
			} catch (SQLException e) {
			}
		}
		
	}

	public void setDb(IDb db) throws WKDbException {
		if(this.db!=null) throw new WKDbException("数据连接池已存在！");
		this.db = db;
	}

	
	public IDb getDb() {
		return db;
	}

	public Connection getConnection() throws WKDbException, SQLException {
		if(conn==null){
			conn = db.getConnection();
			if(getTransaction()) conn.setAutoCommit(false);
		}
		return conn;
	}
	public Connection getConn() {
		return conn;
	}
}
